package com.t3.anistory
{
	import com.t3.client.T3Client;
	import com.t3.display.StageObject;
	import com.t3.events.StoryEvent;
	import com.t3.tuio.TUIOEvent;
	import com.t3.util.AniStorage;
	import com.t3.animation.Sketchline;
	import com.t3.fx.Letter;
	
	import flash.display.Sprite;
	import flash.events.KeyboardEvent;
	import flash.net.SharedObject;
	
	/**
	 *  Waslijn klasse
	 * 	De waslijn klasse beheert de pagina's en laat van alle pagina's een miniversie zien	
	 *  op zijn waslijn. 
	 * 	@author David Hoevers, Veron Wormeester
	 */
	public class Waslijn extends StageObject
	{
		[Embed(source='/waslijn.swf')]
		private static var mc_Waslijn:Class;
		
		private var _pages:Array = new Array();
		private var curPage:uint = 0;
		private var _currentStory:AniStory;
		
		private var _playButton:PlayButton;
		private var mcWaslijn:Sprite;
		
		public function Waslijn():void
		{
			_playButton = new PlayButton();
			mcWaslijn = new mc_Waslijn();
			
			this.addChild( mcWaslijn );
			this.addChild( _playButton );
			
			mcWaslijn.x = _playButton.x + 150;
			_playButton.y -= 45;
			initPages( 6 );
		}
		
		private function initPages( numPages:uint ):void
		{
			var page:StoryPage;
			
			for( var i:uint = 0; i < numPages; i++ )
			{
				page = new StoryPage();
				page.stageLoc = this.stageLoc;
				page.x = mcWaslijn.x;
				page.x += 75 + page.index * 175;
				page.y += 8;
				
				this.addEventListener( StoryEvent.STORY_CHANGED, page.anistory.storyChanged );
				
				this.addChild( page );
				_pages.push( page );
			}
			
			currentPage = _pages[ 0 ];
			restore( numPages );
		}
		
		public function get pages():Array
		{
			return _pages;
		}
		
	
		public function get currentStory():AniStory
		{
			return _currentStory;
		}
		
		public function get currentPage():StoryPage
		{
			return _pages[ curPage ];
		}
		
		public function get pageID():uint 
		{
			return curPage;
		}
		
		/**
		 *  Slaat de pagina op, en zet de huidige pagina op een andere pagina.
		 */
		public function set currentPage( page:StoryPage ):void
		{
			currentPage.active = false;
			page.active = true;
			
			if( currentStory != null )
			{
				T3Client.client.removeEventListener( TUIOEvent.ADD_TUIO_CUR, _currentStory.sketchbook.addCursor );
				save();
			}
				
			T3Client.client.addEventListener( TUIOEvent.ADD_TUIO_CUR, page.anistory.sketchbook.addCursor );
			
			curPage = page.index;
			_currentStory = page.anistory;			
			
			dispatchEvent( new StoryEvent( StoryEvent.STORY_CHANGED, _currentStory ) );
		}
		
		/**
		 *  Roept de AniStorage aan om van de huidige sketchbook de lijnen op te slaan
		 *  en van de notebook de objectArr, wat een transformatie is van de opgeslagen letters
		 *  in een dictionary naar een array. 
		 */
		public function save():void
		{
			AniStorage.Store( currentStory.sketchbook.sketchlines, currentStory.notebook.objectArr, curPage );
		}
		
		/**
		 *  restore laadt uit de anistorage de pagina's en zorgt ervoor dat deze neergezet worden op de waslijn.
		 *  hierbij zijn de prepare functies nodig om de instanties in te laden, anders geven deze een foutmelding 
		 *  omdat deze niet geserialized kunnen worden
		 */
		private function restore( numPages:uint ):void
		{

			Sketchline.prepare();
			Letter.prepare();
			
			for ( var v:uint = 0; v < numPages; v++ ) 
			{
				var Pod:SharedObject = AniStorage.GetStory(v);
				
				if (Pod.data.letters != null)
				{
					this._pages[v].anistory.notebook.sketchLetters( Pod.data.letters );
				}
				
				if (Pod.data.cursors != null)
				{
					this._pages[v].anistory.sketchbook.sketchSprite( Pod.data.cursors );
				}
			}
		}
		
		public function get playButton():PlayButton
		{
			return _playButton;
		}
		
		
		
		/**
		 * keyDown wordt verder nu niet gebruikt, maar kan in de toekomst allicht nog handig zijn, net als previousPage en nextPage
		 * 
		 *
		public function keyDown( event:KeyboardEvent ):void
		{
			switch( event.keyCode )
			{
				case 37: previousPage(); // links
					
					break;
				case 39: nextPage(); // rechts
					break;
			}
		}
		
		public function previousPage():void
		{
			var curPage:uint = curPage-1 < 0 ? _pages.length-1 : curPage-1;
			
			currentPage = _pages[ curPage ];
		}
		
		public function nextPage():void
		{
			var curPage:uint = (curPage+1) % _pages.length;
			
			currentPage = _pages[ curPage ];
		}
		*/
	}
}


		